Customer Segmentation and Product Recommendation
number_sections: true
Olist
Olist adalah marketplace yang beroperasi sebagai perusahaan teknologi SaaS (Software as a Service) di segmen e-commerce sejak 2015. Olist menawarkan solusi bagi pemilik toko dari semua ukuran untuk meningkatkan penjualan mereka melalui platform online.
Retrieving Data
Read Data
Dataset yang digunakan berisi informasi transaksi dari September 2016 sampai Oktober 2018. Dataset ini didownload dari https://www.kaggle.com/olistbr/brazilian-ecommerce
Data Inspection
Customers
# A tibble: 6 x 5
customer_id customer_unique_id customer_zip_co~ customer_city customer_state
<chr> <chr> <chr> <chr> <chr>
1 06b8999e2fba~ 861eff4711a542e4b~ 14409 franca SP
2 18955e83d337~ 290c77bc529b7ac93~ 09790 sao bernardo~ SP
3 4e7b3e002885~ 060e732b5b29e8181~ 01151 sao paulo SP
4 b2b6027bc5c5~ 259dac757896d24d7~ 08775 mogi das cru~ SP
5 4f2d8ab171c8~ 345ecd01c38d18a90~ 13056 campinas SP
6 879864dab9bc~ 4c93744516667ad3b~ 89254 jaragua do s~ SC
Geolocation
geolocation_zip_code_prefix geolocation_lat geolocation_lng
1 98780 -36.60537 -64.28395
2 28155 -34.58642 -58.73210
3 96255 -33.69142 -53.48016
4 96100 -33.52580 -53.36455
5 96230 -33.52560 -53.36642
6 96300 -32.56395 -53.38472
geolocation_city geolocation_state state_name region
1 santa rosa RS Rio Grande do Sul South
2 santa maria RJ Rio de Janeiro Southeast
3 chui RS Rio Grande do Sul South
4 santa vitoria do palmar RS Rio Grande do Sul South
5 santa vitoria do palmar RS Rio Grande do Sul South
6 jaguarao RS Rio Grande do Sul South
sellers
# A tibble: 6 x 4
seller_id seller_zip_code_pref~ seller_city seller_state
<chr> <chr> <chr> <chr>
1 3442f8959a84dea7ee197c632c~ 13023 campinas SP
2 d1b65fc7debc3361ea86b5f14c~ 13844 mogi guacu SP
3 ce3ad9de960102d0677a81f5d0~ 20031 rio de janeiro RJ
4 c0f3eea2e14555b6faeea3dd58~ 04195 sao paulo SP
5 51a04a8a6bdcb23deccc82b0b8~ 12914 braganca pauli~ SP
6 c240c4061717ac1806ae6ee72b~ 20920 rio de janeiro RJ
Product
# A tibble: 6 x 10
product_id product_code product_categor~ product_name_le~ product_descrip~
<chr> <chr> <chr> <dbl> <dbl>
1 1e9e8ef04~ PR00001 perfumery 40 287
2 3aa071139~ PR00002 art 44 276
3 96bd76ec8~ PR00003 sports_leisure 46 250
4 cef67bcfe~ PR00004 baby 27 261
5 9dc1a7de2~ PR00005 housewares 37 402
6 41d3672d4~ PR00006 musical_instrum~ 60 745
# ... with 5 more variables: product_photos_qty <dbl>, product_weight_g <dbl>,
# product_length_cm <dbl>, product_height_cm <dbl>, product_width_cm <dbl>
orders
# A tibble: 6 x 8
order_id customer_id order_status order_purchase_tim~ order_approved_at
<chr> <chr> <chr> <dttm> <dttm>
1 e481f51~ 9ef432eb62~ delivered 2017-10-02 10:56:33 2017-10-02 11:07:15
2 53cdb2f~ b0830fb474~ delivered 2018-07-24 20:41:37 2018-07-26 03:24:27
3 47770eb~ 41ce2a54c0~ delivered 2018-08-08 08:38:49 2018-08-08 08:55:23
4 949d5b4~ f88197465e~ delivered 2017-11-18 19:28:06 2017-11-18 19:45:59
5 ad21c59~ 8ab97904e6~ delivered 2018-02-13 21:18:39 2018-02-13 22:20:29
6 a4591c2~ 503740e9ca~ delivered 2017-07-09 21:57:05 2017-07-09 22:10:13
# ... with 3 more variables: order_delivered_carrier_date <dttm>,
# order_delivered_customer_date <dttm>, order_estimated_delivery_date <dttm>
Order Items
# A tibble: 6 x 7
order_id order_item_id product_id seller_id shipping_limit_date price
<chr> <dbl> <chr> <chr> <dttm> <dbl>
1 0001024~ 1 4244733e0~ 48436dad~ 2017-09-19 09:45:35 58.9
2 00018f7~ 1 e5f2d52b8~ dd7ddc04~ 2017-05-03 11:05:13 240.
3 000229e~ 1 c777355d1~ 5b51032e~ 2018-01-18 14:48:30 199
4 00024ac~ 1 7634da152~ 9d7a1d34~ 2018-08-15 10:10:18 13.0
5 00042b2~ 1 ac6c36230~ df560393~ 2017-02-13 13:57:51 200.
6 00048cc~ 1 ef92defde~ 6426d21a~ 2017-05-23 03:55:27 21.9
# ... with 1 more variable: freight_value <dbl>
Order Payments
# A tibble: 6 x 5
order_id payment_sequent~ payment_type payment_installm~ payment_value
<chr> <dbl> <chr> <dbl> <dbl>
1 b81ef226f3fe178~ 1 credit_card 8 99.3
2 a9810da82917af2~ 1 credit_card 1 24.4
3 25e8ea4e93396b6~ 1 credit_card 1 65.7
4 ba78997921bbcdc~ 1 credit_card 8 108.
5 42fdf880ba16b47~ 1 credit_card 2 128.
6 298fcdf1f73eb41~ 1 credit_card 2 96.1
Order Reviews
# A tibble: 6 x 7
review_id order_id review_score review_comment_~ review_comment_~
<chr> <chr> <dbl> <chr> <chr>
1 7bc24061~ 73fc7af~ 4 <NA> <NA>
2 80e641a1~ a548910~ 5 <NA> <NA>
3 228ce550~ f9e4b65~ 5 <NA> <NA>
4 e64fb393~ 658677c~ 5 <NA> Recebi bem ante~
5 f7c4243c~ 8e6bfb8~ 5 <NA> Parabéns lojas ~
6 15197aa6~ b18dcdf~ 1 <NA> <NA>
# ... with 2 more variables: review_creation_date <dttm>,
# review_answer_timestamp <dttm>
Data Preparation
Data Cleansing
Customers
Data Structure
Observations: 99,441
Variables: 5
$ customer_id <chr> "06b8999e2fba1a1fbc88172c00ba8bc7", "18955...
$ customer_unique_id <chr> "861eff4711a542e4b93843c6dd7febb0", "290c7...
$ customer_zip_code_prefix <chr> "14409", "09790", "01151", "08775", "13056...
$ customer_city <chr> "franca", "sao bernardo do campo", "sao pa...
$ customer_state <chr> "SP", "SP", "SP", "SP", "SP", "SC", "SP", ...
Missing Value
customer_id customer_unique_id customer_zip_code_prefix
0 0 0
customer_city customer_state
0 0
Duplicate Value
data data_unique
1 99441 99441
Geolocation
Data Structure
Observations: 19,015
Variables: 7
$ geolocation_zip_code_prefix <chr> "98780", "28155", "96255", "96100", "96...
$ geolocation_lat <dbl> -36.60537, -34.58642, -33.69142, -33.52...
$ geolocation_lng <dbl> -64.28395, -58.73210, -53.48016, -53.36...
$ geolocation_city <chr> "santa rosa", "santa maria", "chui", "s...
$ geolocation_state <chr> "RS", "RJ", "RS", "RS", "RS", "RS", "RS...
$ state_name <chr> "Rio Grande do Sul", "Rio de Janeiro", ...
$ region <chr> "South", "Southeast", "South", "South",...
Missing Value
geolocation_zip_code_prefix geolocation_lat
0 0
geolocation_lng geolocation_city
0 0
geolocation_state state_name
0 0
region
0
Duplicate Value
data data_unique
1 19015 19015
Sellers
Data Structure
Observations: 3,095
Variables: 4
$ seller_id <chr> "3442f8959a84dea7ee197c632cb2df15", "d1b65fc...
$ seller_zip_code_prefix <chr> "13023", "13844", "20031", "04195", "12914",...
$ seller_city <chr> "campinas", "mogi guacu", "rio de janeiro", ...
$ seller_state <chr> "SP", "SP", "RJ", "SP", "SP", "RJ", "PE", "S...
Missing Value
seller_id seller_zip_code_prefix seller_city
0 0 0
seller_state
0
Duplicate Value
data data_unique
1 3095 3095
Product
Data Structure
Observations: 32,951
Variables: 10
$ product_id <chr> "1e9e8ef04dbcff4541ed26657ea517e5", "3aa...
$ product_code <chr> "PR00001", "PR00002", "PR00003", "PR0000...
$ product_category_name <chr> "perfumery", "art", "sports_leisure", "b...
$ product_name_lenght <dbl> 40, 44, 46, 27, 37, 60, 56, 56, 57, 36, ...
$ product_description_lenght <dbl> 287, 276, 250, 261, 402, 745, 1272, 184,...
$ product_photos_qty <dbl> 1, 1, 1, 1, 4, 1, 4, 2, 1, 1, 1, 4, 3, 2...
$ product_weight_g <dbl> 225, 1000, 154, 371, 625, 200, 18350, 90...
$ product_length_cm <dbl> 16, 30, 18, 26, 20, 38, 70, 40, 27, 17, ...
$ product_height_cm <dbl> 10, 18, 9, 4, 17, 5, 24, 8, 13, 10, 10, ...
$ product_width_cm <dbl> 14, 20, 15, 26, 13, 11, 44, 40, 17, 12, ...
Missing Value
product_id product_code
0 0
product_category_name product_name_lenght
610 610
product_description_lenght product_photos_qty
610 610
product_weight_g product_length_cm
2 2
product_height_cm product_width_cm
2 2
cukup banyak data produk yang kosong, namun kita biarkan saja dulu karena variabel tersebut kurang berpengaruh pada projek ini.
Duplicate Value
data data_unique
1 32951 32951
Orders
Data Structure
Observations: 99,441
Variables: 8
$ order_id <chr> "e481f51cbdc54678b7cc49136f2d6af7", "...
$ customer_id <chr> "9ef432eb6251297304e76186b10a928d", "...
$ order_status <chr> "delivered", "delivered", "delivered"...
$ order_purchase_timestamp <dttm> 2017-10-02 10:56:33, 2018-07-24 20:4...
$ order_approved_at <dttm> 2017-10-02 11:07:15, 2018-07-26 03:2...
$ order_delivered_carrier_date <dttm> 2017-10-04 19:55:00, 2018-07-26 14:3...
$ order_delivered_customer_date <dttm> 2017-10-10 21:25:13, 2018-08-07 15:2...
$ order_estimated_delivery_date <dttm> 2017-10-18, 2018-08-13, 2018-09-04, ...
Ubah tipe data order_status menjadi factor:
Missing Value
order_id customer_id
0 0
order_status order_purchase_timestamp
0 0
order_approved_at order_delivered_carrier_date
160 1783
order_delivered_customer_date order_estimated_delivery_date
2965 0
Duplicate Value
data data_unique
1 99441 99441
Order Items
Data Structure
Observations: 112,650
Variables: 7
$ order_id <chr> "00010242fe8c5a6d1ba2dd792cb16214", "00018f77f2...
$ order_item_id <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,...
$ product_id <chr> "4244733e06e7ecb4970a6e2683c13e61", "e5f2d52b80...
$ seller_id <chr> "48436dade18ac8b2bce089ec2a041202", "dd7ddc04e1...
$ shipping_limit_date <dttm> 2017-09-19 09:45:35, 2017-05-03 11:05:13, 2018...
$ price <dbl> 58.90, 239.90, 199.00, 12.99, 199.90, 21.90, 19...
$ freight_value <dbl> 13.29, 19.93, 17.87, 12.79, 18.14, 12.69, 11.85...
Missing Value
order_id order_item_id product_id seller_id
0 0 0 0
shipping_limit_date price freight_value
0 0 0
Duplicate Value
data data_unique
1 99441 99441
Order Payments
Data Structure
Observations: 103,886
Variables: 5
$ order_id <chr> "b81ef226f3fe1789b1e8b2acac839d17", "a9810da82...
$ payment_sequential <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ payment_type <chr> "credit_card", "credit_card", "credit_card", "...
$ payment_installments <dbl> 8, 1, 1, 8, 2, 2, 1, 3, 6, 1, 8, 1, 1, 5, 4, 1...
$ payment_value <dbl> 99.33, 24.39, 65.71, 107.78, 128.45, 96.12, 81...
Merubah tipe data payment_type:
Missing Value
order_id payment_sequential payment_type
0 0 0
payment_installments payment_value
0 0
Duplicate Value
data data_unique
1 103886 99440
Terdapat data pembayaran yang duplikat karena terdapat order yang melakukan pembayaran secara cicilan sehingga tidak menjadi masalah, namun nantinya tetap akan disesuaikan dengan kebutuhan.
Order Reviews
Data Structure
Observations: 100,000
Variables: 7
$ review_id <chr> "7bc2406110b926393aa56f80a40eba40", "80e641...
$ order_id <chr> "73fc7af87114b39712e6da79b0a377eb", "a54891...
$ review_score <dbl> 4, 5, 5, 5, 5, 1, 5, 5, 5, 4, 5, 5, 4, 4, 3...
$ review_comment_title <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "recome...
$ review_comment_message <chr> NA, NA, NA, "Recebi bem antes do prazo esti...
$ review_creation_date <dttm> 2018-01-18, 2018-03-10, 2018-02-17, 2017-0...
$ review_answer_timestamp <dttm> 2018-01-18 21:46:59, 2018-03-11 03:05:13, ...
Missing Value
review_id order_id review_score
0 0 0
review_comment_title review_comment_message review_creation_date
88287 58255 0
review_answer_timestamp
0
Untuk sementara data review_comment_title dan review_comment_message yang NULL tidak masalah karena tidak masuk ke goal yang ingin dicapai.
Duplicate Value
data data_unique
1 100000 99173
Terdapat data review yang duplikat karena terdapat order yang memberikan review lebih dari 1 kali.
Combining Data
Data: Customer Order
Berikut ini merupakan data transaksi customer yang didapat dari hasil merge/join antara data customer, orders, order_item, order_review, seller dan geolocation. Berikut struktur data dan pengecekan missing value:
Data Structure:
Observations: 113,417
Variables: 31
$ order_id <chr> "2e7a8482f6fb09756ca50c10d7bfc047", "...
$ order_status <fct> shipped, shipped, canceled, canceled,...
$ order_purchase_timestamp <dttm> 2016-09-04 21:15:19, 2016-09-04 21:1...
$ order_approved_at <dttm> 2016-10-07 13:18:03, 2016-10-07 13:1...
$ order_delivered_carrier_date <dttm> 2016-10-18 13:14:51, 2016-10-18 13:1...
$ order_delivered_customer_date <dttm> NA, NA, NA, NA, 2016-11-09 07:47:38,...
$ order_estimated_delivery_date <dttm> 2016-10-20, 2016-10-20, 2016-10-28, ...
$ customer_unique_id <chr> "b7d76e111c89f7ebf14761390f0f7d17", "...
$ customer_zip_code_prefix <chr> "69309", "69309", "99025", "12244", "...
$ customer_lat <dbl> 2.812997, 2.812997, -28.261098, -23.2...
$ customer_lng <dbl> -60.69526, -60.69526, -52.40767, -45....
$ customer_city <chr> "boa vista", "boa vista", "passo fund...
$ customer_state_code <fct> RR, RR, RS, SP, SP, SP, SP, SP, SP, R...
$ customer_state_name <fct> Roraima, Roraima, Rio Grande do Sul, ...
$ customer_region <fct> North, North, South, Southeast, South...
$ order_item_id <dbl> 1, 2, 1, NA, 1, 2, 3, 1, 1, 1, 1, 1, ...
$ product_id <chr> "c1488892604e4ba5cff5b4eb4d595400", "...
$ product_code <chr> "PR29132", "PR12485", "PR09187", NA, ...
$ product_category_name <chr> "furniture_decor", "furniture_decor",...
$ price <dbl> 39.99, 32.90, 59.50, NA, 44.99, 44.99...
$ freight_value <dbl> 31.67, 31.67, 15.56, NA, 2.83, 2.83, ...
$ review_score <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 3, 1...
$ seller_id <chr> "1554a68530182680ad5c8b042c3ab563", "...
$ shipping_limit_date <dttm> 2016-10-26 18:25:19, 2016-10-26 18:2...
$ seller_zip_code_prefix <chr> "37580", "37580", "81050", NA, "81810...
$ seller_lat <dbl> -22.42881, -22.42881, -25.49504, NA, ...
$ seller_lng <dbl> -46.56955, -46.56955, -49.29960, NA, ...
$ seller_city <chr> "monte siao", "monte siao", "curitiba...
$ seller_state_code <fct> MG, MG, PR, NA, PR, PR, PR, SP, PR, S...
$ seller_state_name <fct> Minas Gerais, Minas Gerais, Paraná, N...
$ seller_region <fct> Southeast, Southeast, South, NA, Sout...
Missing Value:
order_id order_status
0 0
order_purchase_timestamp order_approved_at
0 156
order_delivered_carrier_date order_delivered_customer_date
1961 3221
order_estimated_delivery_date customer_unique_id
0 0
customer_zip_code_prefix customer_lat
0 305
customer_lng customer_city
305 0
customer_state_code customer_state_name
305 305
customer_region order_item_id
305 767
product_id product_code
767 767
product_category_name price
2370 767
freight_value review_score
767 0
seller_id shipping_limit_date
767 767
seller_zip_code_prefix seller_lat
767 1020
seller_lng seller_city
1020 767
seller_state_code seller_state_name
1020 1020
seller_region
1020
Cukup banyak data geolocation yang kosong maka perlu kita sesuaikan. Data geolocation yang null akan dilakukan imputasi menggunakan rata-rata latitude dan longitude dari setiap customer dan pelanggan yang berada pada kota/state yang sama.
seller_id seller_zip_code_prefix
0 0
seller_city seller_state
0 0
geolocation_zip_code_prefix geolocation_lat
5 5
geolocation_lng geolocation_city
5 5
geolocation_state state_name
5 5
region
5
Re-combine Data Customer Order:
Missing value after re-combine
order_id order_status
0 0
order_purchase_timestamp order_approved_at
0 156
order_delivered_carrier_date order_delivered_customer_date
1961 3221
order_estimated_delivery_date customer_unique_id
0 0
customer_zip_code_prefix customer_lat
0 0
customer_lng customer_city
0 0
customer_state_code customer_state_name
0 0
customer_region order_item_id
0 767
product_id product_code
767 767
product_category_name price
2370 0
freight_value review_score
0 0
seller_id shipping_limit_date
767 767
seller_zip_code_prefix seller_lat
767 767
seller_lng seller_city
767 767
seller_state_code seller_state_name
767 767
seller_region
767
Dapat dilihat masih terdapat missing value pada data order_item_id, product_id,price, geolocation seller, hal ini terjadi pada order yang memiliki status canceled dan unavailable, sehingga tidak masalah karena menandakan bahwa customer tidak jadi melakukan order. Kemudian terdapat missing value juga pada data order_approved_at , order_delivered_carrier_date dan order_delivered_customer_date, namun tidak menjadi masalah karena sementara ini variabel tersebut tidak menjadi fokus di projek ini. Berikut 10 data Customer Order teratas:
# A tibble: 10 x 31
order_id order_status order_purchase_tim~ order_approved_at
<chr> <fct> <dttm> <dttm>
1 2e7a848~ shipped 2016-09-04 21:15:19 2016-10-07 13:18:03
2 2e7a848~ shipped 2016-09-04 21:15:19 2016-10-07 13:18:03
3 e5fa5a7~ canceled 2016-09-05 00:15:34 2016-10-07 13:17:15
4 809a282~ canceled 2016-09-13 15:24:19 2016-10-07 13:16:46
5 bfbd0f9~ delivered 2016-09-15 12:16:38 2016-09-15 12:16:38
6 bfbd0f9~ delivered 2016-09-15 12:16:38 2016-09-15 12:16:38
7 bfbd0f9~ delivered 2016-09-15 12:16:38 2016-09-15 12:16:38
8 71303d7~ canceled 2016-10-02 22:07:52 2016-10-06 15:50:56
9 3b697a2~ delivered 2016-10-03 09:44:50 2016-10-06 15:50:54
10 be5bc2f~ delivered 2016-10-03 16:56:50 2016-10-06 16:03:44
# ... with 27 more variables: order_delivered_carrier_date <dttm>,
# order_delivered_customer_date <dttm>, order_estimated_delivery_date <dttm>,
# customer_unique_id <chr>, customer_zip_code_prefix <chr>,
# customer_lat <dbl>, customer_lng <dbl>, customer_city <chr>,
# customer_state_code <fct>, customer_state_name <fct>,
# customer_region <fct>, order_item_id <dbl>, product_id <chr>,
# product_code <chr>, product_category_name <chr>, price <dbl>,
# freight_value <dbl>, review_score <dbl>, seller_id <chr>,
# shipping_limit_date <dttm>, seller_zip_code_prefix <chr>, seller_lat <dbl>,
# seller_lng <dbl>, seller_city <chr>, seller_state_code <fct>,
# seller_state_name <fct>, seller_region <fct>
Data: Order Payment
Berikut ini data pembayaran per-setiap order yang merupakan hasil merge/join dari data customer, order dan order_payment. Perlu diketahui bahwa Olist mendukung fitur sistem pembayaran kredit dan juga multi-payment. Berikut struktur data dan pengecekan missing value:
Data Structure:
Observations: 99,433
Variables: 8
$ order_id <chr> "00010242fe8c5a6d1ba2dd792cb16214", "00018f77f2f...
$ payment_sequential <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ boleto <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 34.59, 0.00, 0.00,...
$ credit_card <dbl> 72.19, 259.83, 216.87, 25.78, 218.04, 0.00, 31.7...
$ debit_card <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ not_defined <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ voucher <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ total_payment <dbl> 72.19, 259.83, 216.87, 25.78, 218.04, 34.59, 31....
Missing Value:
order_id payment_sequential boleto credit_card
0 0 0 0
debit_card not_defined voucher total_payment
0 0 0 0
Informasi diatas menunjukan tidak terdapat missing value dari data Order Payment. Berikut 10 data Order Payment teratas:
# A tibble: 10 x 8
order_id payment_sequent~ boleto credit_card debit_card not_defined voucher
<chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0001024~ 1 0 72.2 0 0 0
2 00018f7~ 1 0 260. 0 0 0
3 000229e~ 1 0 217. 0 0 0
4 00024ac~ 1 0 25.8 0 0 0
5 00042b2~ 1 0 218. 0 0 0
6 00048cc~ 1 34.6 0 0 0 0
7 00054e8~ 1 0 31.8 0 0 0
8 000576f~ 1 0 881. 0 0 0
9 0005a1a~ 1 0 158. 0 0 0
10 0005f50~ 1 0 65.4 0 0 0
# ... with 1 more variable: total_payment <dbl>
Exploratory Data Analysis
Count of Order by Status
Data divisualisasikan menggunakan Log(Order Frequency) supaya frekuensi minimun tetap dapat terlihat jelas. Perlu diketahui, data Order ini memiliki beberapa status antara lain:
1. Processing : Status setelah customer melakukan order.
2. Unavailable : Satatus ketika penjual menyatakan stock produk tidak tersedia setelah customer melakukan order.
3. Canceled : Status ketika customer membatalkan order.
4. Approved : Status ketika order disetujui oleh penjual.
5. Invoiced : Status ketika order sudah dibayar oleh customer.
6. Shipped : Status ketika produk sedang dikirimkan oleh penjual ke customer.
7. Delivered : status ketika produk sudah sampai pada customer.
Chart diatas menunjukan jumlah order dengan status Delivered jauh lebih banyak dari yang lainnya pada setiap bulan dari 2016-2018 kecuali pada bulan September-Oktober 2018. Jika dilihat pada bulan September-Oktober 2018 hanya terdapat 1 order berstatus Shipped dan 19 order berstatus Cancelled dan tidak ada order yang berstatus Delivered, sehingga membutikan belum penjualan yang berhasil, kecuali 1 order Shipped tersebut. Mari kita lihat data ordernya.
Growth of Order Frequency
Chart diatas menunjukan frekuensi order pada setiap bulannya dari September 2016 - Oktober 2018. Jika dilihat dari frekuensi order tahun 2016 sangat kecil, namun relatif stabil dan meningkat dari januari 2017 - Agustus 2018. Kemudian terjadi penurunan frekuensi order sangat tinggi pada bulan September-Oktober 2018 dari 7308 order menurun hinga 20 order. Berdasarkan visualisasi status order sebelumnya, 20 order pada bulan September-Oktober 2018 terdiri dari 19 order Cancelled dan 1 order shipped. Produk yang dijual pada Olist terdiri dari berbagai macam jenis dan berbagai macam harga, mari kita lihat order amount nya.
Growth of Order Amount
Terkait penurunan order pada bulan september-Oktober 2018, bisa dilihat order amount bulan september 2018 hanya R$ 166.46 yang merupakan amount dari 1 order yang berstatus Shipped dan karena pada OKtober 2018 seluruh order bersatus Cancelled maka total amount-nya nol(0). Namun secara keseluruhan, dapat dilihat pola visualisasi order amount dan frekuensi order cukup sama. Hal ini menunjukan, frekuensi Order sangat berpengaruh untuk menentukan jumlah order amount, dalam artian hampir dipastikan setiap order memiliki amount disekitar rata-rata, kecuali bulan Agustus 2018, Pada chart frekuensi order menunjukan bulan Agustus 2018 terdapat kenaikan frekuensi order namun pada chart total order amount justru mengalami penurunan. Mengapa?
# A tibble: 3 x 4
# Groups: year [1]
year month freq_order mean_order_amount
<dbl> <dbl> <int> <dbl>
1 2018 6 6167 166.
2 2018 7 6292 168.
3 2018 8 6512 154.
Data diatas menunjukan pada bulan Agustus 2018, rata-rata order amount lebih rendah sehingga mengakibatkan total order amount menjadi lebih rendah. Meskipun begitu, secara keseluruhan frekuensi order sangat berpengaruh terhadap total order amount sehingga kita bisa mengabaikan efek rata-rata order amount perbulan. Berdasarkan case ini dapat disimpulkan bahwa jumlah order amount dapat meningkat jika frekuensi order bertambah, sehingga muncul pertanyaan Bagaimana cara meningkatkan frekuensi order? Tentunya dengan mencari customer baru untuk melakukan order, namun bisa juga apabila jika fokus meningkatkan frekuensi order daripada customer yang sudah ada, sehingga pertanyaannya berubah menjadi Bagaimana meningkatkan frekuensi order daripada customer yang ada?. Oke sebelum sampai kesitu mari kita cek seberapa besar seorang customer melakukan pembelian berulang.
Repeat order paling banyak terjadi 17 kali dan hanya dilakukan oleh 1 orang customer. Selain itu, 97% Customer hanya melakukan 1 kali order. Dalam case ini saya berasumsi bahwa Olist kurang berupaya untuk meningkatkan frekuensi order dari customer yang ada, cukup disayangkan mengingat jumlah customer yang ada tidak sedikit. Terkait chart diatas, maka seharusnya frekuensi order berbanding lurus dengan pertumbuhan customer baru yang melakukan order. Mari kita cek.
Bisa dilihat pola visualisasi chart diatas relatif sama dengan pola visualisasi frekuensi order dan pola visualisasi total order amount, maka seharusnya jumlah customer akan sangat mempengaruhi total order amount yang ada, berikut pengecekannya:
Chart diatas memperjelas bahwa semakin meningkat jumlah customer maka semakin meningkat total order amount. Sangat baik Olist selalu mampu mendapatkan customer baru, meskipun begitu dapat dilihat karena pada September-Oktober 2018 jumlah customer baru hanya 18 orang sehingga menyebabkan total order amount menurun drastis. Saya berpendapat bahwa akan sangat baik apabila Olist mempertimbangkan customer yang sudah ada untuk meningkatkan frekuensi order dan total order amount. Mari kita lihat total order amount dan total customer pada setiap negara bagian di Brazil.
Order Amount & Customer by State
Sao Paulo memiliki total order amount paling tinggi dengan proporsi 37.4% dari total order amount keseluruhan dan jauh lebih tinggi dari negara bagian lainnya. Mari kita cek jumlah customernya.
Total customer paling banyak di Sao Paulo dengan proporsi 41.8% dari jumlah keseluruhan customer dan juga jauh lebih tinggi dari negara bagian lainnya. Hal ini masuk akal, mengingat jumlah customer sangat mempengaruhi total order amount. Dalam case ini, dapat dipastikan Sao Paulo adalah negara bagian yang paling memiliki potensi untuk meningkatkan conversion rate dan customer retention.
Top 10 Product Category by Order
Chart diatas memberikan informasi 10 kategori produk yang paling banyak diorder dari tahun 2016-2018. Jika dilihat kategori produk yang konsisten masuk kategori top 10 product category dari 2016-2018 adalah Health Beauty, Sports Leisure, Funiture Decor, Computers Accessories dan Housewares. Jika dilihat secara keseluruhan, kategori produk Health Beauty menjadi tren produk nomor 1 yang diorder, namun jika secara quantity produk kategori bed bath table yang paling banyak di-order meskipun produk kategori bed bath table tidak masuk top 10 product category di tahun 2016. Berdasarkan case ini jika kita hendak merekomendasikan berdasarkan tren maka kategori produk Health Beauty jelas punya pasar setiap tahunnya, namun jika kita hendak merekomendasikan berdasarkan jumlah order maka produk kategori bed bath table karena jumlah ordernya paling tinggi dan berkelanjutan dari 2017-2018.
Top 10 Product by Order
Chart diatas memberikan informasi 10 produk yang paling banyak di-order dan menunjukan tren produk di-order dari 2016-2018. Jika dilihat 10 produk yang paling banyak dibeli ditahun 2016 tidak masuk ke top 10 product lagi ditahun 2017 dan 2018. Jika dilihat produk PR14052, PR30294, PR04599 masuk kategori top 10 product pada tahun 2017 dan 2018 sehingga kemungkinan produk tersebut masuk tren ditahun selanjutnya lebih besar. Namun jika dilihat secara keseluruhan, tren Top 10 Product produk terjual setiap tahunnya relatif berbeda sehingga akan sulit memastikan rekomendasi produk yang spesifik ke setiap customer setiap tahunnya.
Top 10 Product by Rating
Data Rating diatas diambil berdasarkan total rating yang didapatkan dari setiap produk. Masing-masing produk diberikan rating 1 - sampai 5 setiap kali ketika customer selesai melakukan order. Alasanya menggunakan jumlah rating karena tidak semua produk memiliki total order quantity yang sama. Chart diatas juga menunjukan tren produk yang berbeda setiap tahunnya. Rating sendiri bisa kita gunakan untuk menentukan rekomendasi produk kepada customer dengan mencari tingkat similarity dari masing-masing produk, namun tantangannya 97% customer hanya melakukan 1 kali order yang dimana setiap order hanya terdiri dari 1 produk. Berdasarkan case ini mungkin kita bisa mempertimbangkan variabel lain yang digunakan untuk menentukan rekomendasi produk secara personal.
EDA Conclusion
Olist sangat baik dalam mendatangkan customer baru. Hal ini dibuktikan 97% transaksi dihasilkan oleh customer baru. Namun mengingat hanya 3% Customer yang melakukan repeat order dari September 2016-Oktober 2018, saya berasumsi bahwa Olist kurang memperhatikan customer lama atau customer yang sudah melakukan order sebelumnya. Melihat data order pada September-Oktober 2018, jumlah customer baru hanya 18 orang sehingga mengakibatkan penurunan frekuensi order yang drastis dari bulan sebelumnya. Hal ini menunjukan frekuensi order pada Olist sangat bergantung pada pertumbuhan customer baru, sehingga saya menyarankan supaya Olist juga dapat mempertimbangkan untuk meningkatkan frekuensi order pada customer yang sudah ada. Jika berdasarkan visualisasi diatas, langkah awal yang dapat diambil yaitu memberikan promosi dan rekomendasi produk-produk terlaris dan sedang tren kepada customer yang berada di negara bagian Sao Paulo, Rio de Janeiro, Minas Gerais, Rio Grande do Sul dan Parana. Namun supaya upaya tersebut lebih optimal, saya juga menyarankan Olist untuk melakukan segmentasi terhadap customer yang sudah ada supaya target pasarnya bisa lebih tepat dan tentunya akan lebih menghemat waktu dan biaya pemasaran.
RFM Model
Jika dilihat berdasarkan data sebelumnya, metode analisis RFM cocok untuk diterapkan. Metode analisis Recency, Frequency, Monetary Value (RFM) adalah salah satu metode analisis perilaku pelanggan berdasarkan histori transaksinya. Metode analisis RFM dapat menjelaskan:
- Seberapa baru pelanggan melakukan transaksi?
- Seberapa sering pelanggan melaukan transaksi?
- Seberapa besar transaksi yang sudah dilakukan pelanggan?
Output dari analisis RFM dapat digunakan untuk melakukan segmentasi pelanggan. Sesuai artikel yang dipublish oleh www.marketeers, GO-JEK adalah salah satu perusahaan yang menggunakan metode analisis RFM dalam menentukan segmentasi pelanggan. GO-JEK membagi segmentasi pelanggan ke dalam empat kelas, yaitu Gold, Silver, Bronze, dan Non-Profit. Segmentasi Gold memiliki kualifikasi konsumen dengan high monetary, high frequency, dan high recency. Silver memiliki kualifikasi konsumen dengan tingkat monetary yang tinggi, frequency yang rendah, dan recency yang tinggi. Kategori Bronze terdiri dari konsumen dengan tingkat monetary rendah, frequency, dan recency yang tinggi. Sementara segmentasi Non-Profit memiliki kualifikasi konsumen dengan kualifikasi monetary, frequency, dan recency yang rendah.
Dalam case Olist ini, dataset berisikan data transaksi dari 2016-09-04 sampai 2018-10-17 sehinnga berikut perlakukan value RFM untuk case ini:
- Recency : Selisih antara hari terakhir pelanggan melakukan transaksi dan hari melakukan analisis. Dalam nilai ini terdapat sedikit penyesuaian, berhubung data transaksi terakhir 2018-10-17, maka hari melakukan analisis saya set default 2018-10-18.
- Frequency : Jumlah transaksi yang dilakukan oleh pelanggan dari 2016-09-04 sampai 2018-10-17.
- Monetary : Jumlah total order amount yang sudah dikeluarkan pelanggan dari 2016-09-04 sampai 2018-10-17.
Berikut 10 data teratas dari Customer RFM Model yang dibuat:
customer_unique_id customer_lat customer_lng customer_city
1 0000366f3b9a7992bf8c76cfdf3221e2 -23.33533 -46.82865 cajamar
2 0000b849f77a49e4a4ce2b2a4ca5be3f -23.56739 -46.79296 osasco
3 0000f46a3911fa3c0805444483337064 -27.54379 -48.62568 sao jose
customer_state_code customer_state_name customer_region first_order
1 SP São Paulo Southeast 2018-05-10 10:56:27
2 SP São Paulo Southeast 2018-05-07 11:11:27
3 SC Santa Catarina South 2017-03-10 21:05:03
last_order min_product_price max_product_price total_price
1 2018-05-10 10:56:27 129.9 129.9 129.9
2 2018-05-07 11:11:27 18.9 18.9 18.9
3 2017-03-10 21:05:03 69.0 69.0 69.0
total_freight recency frequency monetary recency_score frequency_score
1 12.00 161 1 141.90 4 1
2 8.29 164 1 27.19 4 1
3 17.22 587 1 86.22 1 1
monetary_score rfm_score
1 4 414
2 1 411
3 2 112
[ reached 'max' / getOption("max.print") -- omitted 7 rows ]
Total Customer by Recency Score
Semakin tinggi nilai Recency maka semakin jauh jarak seorang customer melakukan order terakhirnya. Jika dilihat proporsi jumlah customer berdasar recency score-nya cukup seimbang.
Total Customer by Frequency Score
Semakin tinggi Frequency Score maka semakin banyak melakukan order (Repeat Order). Berdasarkan chart diatas, data kita hanya memiliki Frequency Score 1 dan 5 dengan proporsi yang tidak seimbang. Hal ini sesuai dengan analisa sebelumnya, Frequency Score 1 merupakan data customer yang hanya melakukan 1 kali order dan Frequency Score > 5 merupakan data customer yang melakukan order lebih dari 1 kali.
Total Customer by Monetary Score
Semakin tinggi Monetary Score, maka semakin banyak total order amount yang dikeluarkan seorang customer. Berdasarkan chart diatas, data kita memiliki Monetary Score 1 sampai 5 dengan proporsi yang relatif seimbang.